#include "../../mqserver/message.hpp"

#include <iostream>
#include <gtest/gtest.h>

// NS_Message::MessagePersist per("./queue", "queue1");

// class MessagePersistTest : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//         per.createFile();
//     }

//     virtual void TearDown() override
//     {
//     }
// };

// TEST(message_persist_test, insert)
// {
//     std::list<NS_Message::MessagePtr> q;
//     for(int i = 0; i < 10; i++)
//     {
//         NS_Message::MessagePtr ptr = std::make_shared<NS_Message::Message>();
//         ptr->mutable_payload()->mutable_property()->set_id(std::to_string(i));
//         ptr->mutable_payload()->mutable_property()->set_mode(NS_Message::DeliveryMode::DURABLE);
//         ptr->mutable_payload()->mutable_property()->set_routing_key("news.music.#");

//         ptr->mutable_payload()->set_body("hello world");
//         ptr->mutable_payload()->set_valid("1");

//         q.push_back(ptr);
//         per.insert(ptr);
//     }

//     uint32_t offset = 0;
//     for(auto &ptr : q)
//     {
//         ASSERT_EQ(ptr->offset(), offset);
//         offset += ptr->len();
//     }
// }

// TEST(message_persist_test, erase)
// {
//     NS_Message::MessagePtr ptr = std::make_shared<NS_Message::Message>();
//     ptr->mutable_payload()->mutable_property()->set_id(std::to_string(0));
//     ptr->mutable_payload()->mutable_property()->set_mode(NS_Message::DeliveryMode::DURABLE);
//     ptr->mutable_payload()->mutable_property()->set_routing_key("news.music.#");

//     ptr->mutable_payload()->set_body("hello world");
//     ptr->mutable_payload()->set_valid("1");
//     ptr->set_offset(0);
//     ptr->set_len(47);
//     per.erase(ptr);
// }

// TEST(message_persist_test, gc)
// {
//     per.gc();
// }

// TEST(message_persist_test, deletef)
// {
//     per.deleteFile();
// }

NS_Message::QueueMessage qm("./queue", "queue1");

class QueueMessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
    }

    virtual void TearDown() override
    {
    }
};

TEST(queue_message_test, insert)
{
    NS_Message::MessageProperties mp;
    mp.set_mode(NS_Message::DeliveryMode::DURABLE);
    mp.set_routing_key("news.music.#");
    for(int i = 0; i < 5000; i++)
    {
        mp.set_id(std::to_string(i));
        qm.insert(&mp, "hello world", NS_Message::DeliveryMode::DURABLE);
    }

    ASSERT_EQ(qm.getTotalMsgCount(), 5000);
    ASSERT_EQ(qm.getDurableMsgCount(), 5000);
    ASSERT_EQ(qm.getToPushMsgCount(), 5000);
    ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
}

// TEST(queue_message_test, recovery)
// {
//     ASSERT_EQ(qm.getTotalMsgCount(), 2001);
//     ASSERT_EQ(qm.getToPushMsgCount(), 2001);
//     ASSERT_EQ(qm.getDurableMsgCount(), 2001);
//     ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
// }

TEST(queue_message_test, ack)
{
    for(int i = 0; i < 5000; i++)
    {
        qm.front();
    }
    ASSERT_EQ(qm.getTotalMsgCount(), 5000);
    ASSERT_EQ(qm.getDurableMsgCount(), 5000);
    ASSERT_EQ(qm.getToPushMsgCount(), 0);
    ASSERT_EQ(qm.getWaitACKMsgCount(), 5000);

    // sleep(1000);
}

TEST(queue_message_test, erase)
{
    for(int i = 0; i < 5000; i++)
    {
        qm.erase(std::to_string(i));
    }
    // ASSERT_EQ(qm.getTotalMsgCount(), 1501);
    // ASSERT_EQ(qm.getDurableMsgCount(), 1501);
    // ASSERT_EQ(qm.getToPushMsgCount(), 1501);
    // ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
}

// TEST(queue_message_test, gc)
// {
//     for(int i = 0; i < 1000; i++)
//     {
//         qm.front();
//     }
//     ASSERT_EQ(qm.getTotalMsgCount(), 1501);
//     ASSERT_EQ(qm.getDurableMsgCount(), 1501);
//     ASSERT_EQ(qm.getToPushMsgCount(), 501);
//     ASSERT_EQ(qm.getWaitACKMsgCount(), 1000);

//     for(int i = 500; i < 1500; i++)
//     {
//         qm.erase(std::to_string(i));
//     }
//     ASSERT_EQ(qm.getTotalMsgCount(), 501);
//     ASSERT_EQ(qm.getDurableMsgCount(), 501);
//     ASSERT_EQ(qm.getToPushMsgCount(), 501);
//     ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
// }

// TEST(queue_message_test, recovery)
// {
//     ASSERT_EQ(qm.getTotalMsgCount(), 501);
//     ASSERT_EQ(qm.getToPushMsgCount(), 501);
//     ASSERT_EQ(qm.getDurableMsgCount(), 501);
//     ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
// }

// TEST(queue_message_test, clear)
// {
//     qm.clear();
//     ASSERT_EQ(qm.getTotalMsgCount(), 0);
//     ASSERT_EQ(qm.getToPushMsgCount(), 0);
//     ASSERT_EQ(qm.getDurableMsgCount(), 0);
//     ASSERT_EQ(qm.getWaitACKMsgCount(), 0);
// }

// TEST(queue_message_test, insert)
// {
//     for(int i = 0; i < 2001; i++)
//     {
//         qm.insert(nullptr, "hello world", NS_Message::DeliveryMode::DURABLE);
//     }
// }

// NS_Message::QueueMessageManager qmm("./data");

// class QueueMessageManagerTest : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//     }

//     virtual void TearDown() override
//     {
//         // qmm.clear();
//     }
// };

// TEST(queue_message_manager_test, init)
// {
//     qmm.initQueueMessage("queue1");
//     qmm.initQueueMessage("queue2");
//     qmm.initQueueMessage("queue3");
//     qmm.initQueueMessage("queue4");
//     qmm.initQueueMessage("queue5");
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 0);
// }

// TEST(queue_message_manager_test, insert)
// {
//     qmm.insert("queue1", nullptr, "hello world 1", NS_Message::DeliveryMode::DURABLE);
//     qmm.insert("queue2", nullptr, "hello world 2", NS_Message::DeliveryMode::DURABLE);
//     qmm.insert("queue2", nullptr, "hello world 2", NS_Message::DeliveryMode::UNDURABLE);
//     qmm.insert("queue3", nullptr, "hello world 3", NS_Message::DeliveryMode::DURABLE);
//     qmm.insert("queue4", nullptr, "hello world 4", NS_Message::DeliveryMode::DURABLE);
//     qmm.insert("queue5", nullptr, "hello world 5", NS_Message::DeliveryMode::DURABLE);
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 1);

//     ASSERT_EQ(qmm.getToPushMsgCount("queue2"), 2);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue2"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue2"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue2"), 2);
// }

// TEST(queue_message_manager_test, init)
// {
//     qmm.initQueueMessage("queue1");
//     qmm.initQueueMessage("queue2");
//     qmm.initQueueMessage("queue3");
//     qmm.initQueueMessage("queue4");
//     qmm.initQueueMessage("queue5");
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 1);

//     ASSERT_EQ(qmm.getToPushMsgCount("queue2"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue2"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue2"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue2"), 1);

//     ASSERT_EQ(qmm.getToPushMsgCount("queue3"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue3"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue3"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue3"), 1);

//     ASSERT_EQ(qmm.getToPushMsgCount("queue4"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue4"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue4"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue4"), 1);

//     ASSERT_EQ(qmm.getToPushMsgCount("queue5"), 1);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue5"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue5"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue5"), 1);
// }

// TEST(queue_message_manager_test, push)
// {
//     qmm.front("queue1");
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 1);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 1);

// }

// TEST(queue_message_manager_test, ack)
// {
//     qmm.ack("queue1", "ac0577d5-851e-2450-0000-000000000000");
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 0);
// }

// TEST(queue_message_manager_test, init)
// {
//     qmm.initQueueMessage("queue1");
//     qmm.initQueueMessage("queue2");
//     qmm.initQueueMessage("queue3");
//     qmm.initQueueMessage("queue4");
//     qmm.initQueueMessage("queue5");
//     ASSERT_EQ(qmm.size(), 5);
//     ASSERT_EQ(qmm.getToPushMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getWaitACKMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getDurableMsgCount("queue1"), 0);
//     ASSERT_EQ(qmm.getTotalMsgCount("queue1"), 0);
// }


// TEST(queue_message_manager_test, destroy)
// {
//     qmm.destoryQueueMessage("queue1");
//     ASSERT_EQ(qmm.size(), 4);
// }

// TEST(queue_message_manager_test, clear)
// {
//     qmm.clear();
//     ASSERT_EQ(qmm.size(), 0);
// }

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new QueueMessageTest());
    RUN_ALL_TESTS();
    return 0;
}